package io.renren.common.utils;

import java.io.*;

import static com.aliyun.oss.common.utils.IOUtils.safeClose;

public class FileUtil {

    public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
        File targetFile = new File(filePath);
        if(!targetFile.exists()){
            targetFile.mkdirs();
        }
        FileOutputStream out = new FileOutputStream(filePath+fileName);
        out.write(file);
        out.flush();
        out.close();
    }

    /**
     * 将 流 转换为byte
     * @param inStream
     * @return
     * @throws IOException
     */
    public static final byte[] input2byte(InputStream inStream) throws IOException {
        ByteArrayOutputStream swapStream = null;
        try {
            swapStream = new ByteArrayOutputStream();
            byte[] buff = new byte[1024];
            int rc = 0;
            while ((rc = inStream.read(buff, 0, 1024)) > 0) {
                swapStream.write(buff, 0, rc);
            }
            return swapStream.toByteArray();
        } catch (Exception e) {
            e.getStackTrace();
        } finally {
            if (swapStream != null) {
                safeClose(swapStream);
            }
        }
        return null;
    }

    /**
     * 删除单个文件
     * @param   sPath    被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = null;
        file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 删除目录（文件夹）以及目录下的文件
     * @param   sPath 被删除目录的文件路径
     * @return  目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String sPath) {
        //如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        //如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        //删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            //删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) break;
            } //删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) break;
            }
        }
        if (!flag) return false;
        //删除当前目录
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 重命名文件夹, 文件名
     * @param String path		文件夹, 文件路径
     * @param String newName	新文件夹, 文件名
     * @return	是否操作成功
     */
    public static boolean reName(String path, String newName) {
        try {
            File file = null;
            file = new File(path);

            if(file.exists()){
                if(file.isFile()){	//文件
                    //截取文件绝对路径, 不包含文件名
                    StringBuffer filePath = new StringBuffer(file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(file.getName())));
                    filePath.append(newName)	//添加新文件名
                            .append(file.getName().substring(file.getName().lastIndexOf("."), file.getName().length()));	//添加文件后缀

                    //重命名文件
                    file.renameTo(new File(filePath.toString()));
                }else{				//文件夹
                    //截取文件夹据对路径, 不包含当前文件夹名称
                    StringBuffer filePath = new StringBuffer(file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(file.getName())));
                    filePath.append(newName);	//添加新文件夹名称

                    //重命名文件夹
                    file.renameTo(new File(filePath.toString()));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}
